home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet multimedia / Muzyka / Edytory sampli (probek dzwieku) / ZynAddSubFX_2.2.0 / Setup_ZynAddSubFX-2.2.0.exe / source code / UI / MasterUI.fl < prev    next >
Text File  |  2005-04-08  |  58KB  |  1,799 lines

  1. # data file for the Fltk User Interface Designer (fluid)
  2. version 1.0106 
  3. header_name {.h} 
  4. code_name {.cc}
  5. decl {//Copyright (c) 2002-2005 Nasca Octavian Paul} {} 
  6.  
  7. decl {//License: GNU GPL version 2} {} 
  8.  
  9. decl {\#include <stdlib.h>} {public
  10.  
  11. decl {\#include <stdio.h>} {public
  12.  
  13. decl {\#include <string.h>} {public
  14.  
  15. decl {\#include "WidgetPDial.h"} {public
  16.  
  17. decl {\#include "ADnoteUI.h"} {public
  18.  
  19. decl {\#include "SUBnoteUI.h"} {public
  20.  
  21. decl {\#include "EffUI.h"} {public
  22.  
  23. decl {\#include "VirKeyboard.h"} {public
  24.  
  25. decl {\#include "ConfigUI.h"} {public
  26.  
  27. decl {\#include "BankUI.h"} {public
  28.  
  29. decl {\#include "PartUI.h"} {public
  30.  
  31. decl {\#include "MicrotonalUI.h"} {public
  32.  
  33. decl {\#include "SeqUI.h"} {public
  34.  
  35. decl {\#include "PresetsUI.h"} {public
  36.  
  37. decl {\#include "../Misc/Master.h"} {public
  38.  
  39. decl {\#include "../Misc/Part.h"} {public
  40.  
  41. decl {\#include "../Misc/Util.h"} {public
  42.  
  43. decl {\#include "../globals.h"} {public
  44.  
  45. class VUMeter {: {public Fl_Box}
  46. } {
  47.   Function {VUMeter(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} {
  48.     code {master=NULL;
  49. npart=-1;} {}
  50.   }
  51.   Function {init(Master *master_,int part_)} {} {
  52.     code {//the "part_" parameters sets the part (if it is >=0), else it sets the master
  53. master=master_;
  54. label(NULL);
  55. npart=part_;
  56. olddbl=0.0;
  57. olddbr=0.0;
  58. oldrmsdbl=0.0;
  59. oldrmsdbr=0.0;} {}
  60.   }
  61.   Function {draw_master()} {} {
  62.     code {\#define MIN_DB (-48)
  63.  
  64. int ox=x(); int oy=y(); int lx=w(); int ly=h();
  65.  
  66. pthread_mutex_lock(&master->mutex);
  67. REALTYPE dbl=rap2dB(master->vuoutpeakl);
  68. REALTYPE dbr=rap2dB(master->vuoutpeakr);
  69. REALTYPE rmsdbl=rap2dB(master->vurmspeakl);
  70. REALTYPE rmsdbr=rap2dB(master->vurmspeakr);
  71. REALTYPE maxdbl=rap2dB(master->vumaxoutpeakl);
  72. REALTYPE maxdbr=rap2dB(master->vumaxoutpeakr);
  73. int clipped=master->vuclipped;
  74. pthread_mutex_unlock(&master->mutex);
  75.  
  76. dbl=(MIN_DB-dbl)/MIN_DB; 
  77. if (dbl<0.0) dbl=0.0;
  78.   else if (dbl>1.0)dbl=1.0;
  79.  
  80. dbr=(MIN_DB-dbr)/MIN_DB; 
  81. if (dbr<0.0) dbr=0.0;
  82.   else if (dbr>1.0) dbr=1.0; 
  83.  
  84. dbl=dbl*0.4+olddbl*0.6;
  85. dbr=dbr*0.4+olddbr*0.6;
  86.  
  87. olddbl=dbl;
  88. olddbr=dbr;
  89.  
  90. \#define VULENX (lx-35)
  91. \#define VULENY (ly/2-3)
  92.  
  93. dbl*=VULENX;dbr*=VULENX;
  94.  
  95. int idbl=(int) dbl;
  96. int idbr=(int) dbr;
  97.  
  98. //compute RMS - start
  99. rmsdbl=(MIN_DB-rmsdbl)/MIN_DB; 
  100. if (rmsdbl<0.0) rmsdbl=0.0;
  101.   else if (rmsdbl>1.0) rmsdbl=1.0;
  102.  
  103. rmsdbr=(MIN_DB-rmsdbr)/MIN_DB; 
  104. if (rmsdbr<0.0) rmsdbr=0.0;
  105.   else if (rmsdbr>1.0) rmsdbr=1.0; 
  106.  
  107. rmsdbl=rmsdbl*0.4+oldrmsdbl*0.6;
  108. rmsdbr=rmsdbr*0.4+oldrmsdbr*0.6;
  109.  
  110. oldrmsdbl=rmsdbl;
  111. oldrmsdbr=rmsdbr;
  112.  
  113.  
  114. rmsdbl*=VULENX;rmsdbr*=VULENX;
  115.  
  116. int irmsdbl=(int) rmsdbl;
  117. int irmsdbr=(int) rmsdbr;
  118. //compute RMS - end
  119.  
  120.  
  121.  
  122. //draw the vu-meter lines
  123. //db
  124. fl_rectf(ox,oy,idbr,VULENY,0,200,255);
  125. fl_rectf(ox,oy+ly/2,idbl,VULENY,0,200,255);
  126. //black
  127. fl_rectf(ox+idbr,oy,VULENX-idbr,VULENY,0,0,0);
  128. fl_rectf(ox+idbl,oy+ly/2,VULENX-idbl,VULENY,0,0,0);
  129.  
  130. //draw the scales
  131. REALTYPE  tmp=VULENX*1.0/MIN_DB;
  132. for (int i=1;i<1-MIN_DB;i++){
  133.    int tx=VULENX+(int) (tmp*i);
  134.    fl_rectf(ox+tx,oy,1,VULENY+ly/2,0,160,200);
  135.    if (i%5==0) fl_rectf(ox+tx,oy,1,VULENY+ly/2,0,230,240);
  136.    if (i%10==0) fl_rectf(ox+tx-1,oy,2,VULENY+ly/2,0,225,255);
  137. };
  138.  
  139. //rms
  140. if (irmsdbr>2) fl_rectf(ox+irmsdbr-1,oy,3,VULENY,255,255,0);
  141. if (irmsdbl>2) fl_rectf(ox+irmsdbl-1,oy+ly/2,3,VULENY,255,255,0);
  142.  
  143.  
  144. //draw the red box if clipping has occured
  145. if (clipped==0) fl_rectf(ox+VULENX+2,oy+1,lx-VULENX-3,ly-4,0,0,10);
  146.            else fl_rectf(ox+VULENX+2,oy+1,lx-VULENX-3,ly-4,250,10,10);
  147.  
  148. //draw the maxdB 
  149. fl_font(FL_HELVETICA|FL_BOLD,10);
  150. fl_color(255,255,255);
  151. char tmpstr[10];
  152. if ((maxdbl>MIN_DB-20)){
  153.   snprintf((char *)&tmpstr,10,"%ddB",(int)maxdbr);
  154.   fl_draw(tmpstr,ox+VULENX+1,oy+1,lx-VULENX-1,VULENY,FL_ALIGN_RIGHT,NULL,0);
  155. };
  156. if ((maxdbr>MIN_DB-20)){
  157.   snprintf((char *)&tmpstr,10,"%ddB",(int)maxdbl);
  158.   fl_draw(tmpstr,ox+VULENX+1,oy+ly/2+1,lx-VULENX-1,VULENY,FL_ALIGN_RIGHT,NULL,0);
  159. };} {}
  160.   }
  161.   Function {draw_part()} {} {
  162.     code {\#define MIN_DB (-48)
  163. int ox=x(); int oy=y(); int lx=w(); int ly=h();
  164.  
  165. if (!active_r()){
  166.   pthread_mutex_lock(&master->mutex);
  167.    int fakedb=master->fakepeakpart[npart];
  168.   pthread_mutex_unlock(&master->mutex);
  169.   fl_rectf(ox,oy,lx,ly,140,140,140);
  170.   if (fakedb>0){
  171.     fakedb=(int)(fakedb/255.0*ly)+4;
  172.     fl_rectf(ox+2,oy+ly-fakedb,lx-4,fakedb,0,0,0);
  173.   };
  174.   
  175.   return;
  176. };
  177.  
  178. //draw the vu lines
  179. pthread_mutex_lock(&master->mutex);
  180.  REALTYPE db=rap2dB(master->vuoutpeakpart[npart]);
  181. pthread_mutex_unlock(&master->mutex);
  182.  
  183. db=(MIN_DB-db)/MIN_DB; 
  184. if (db<0.0) db=0.0;
  185.   else if (db>1.0) db=1.0;
  186.  
  187. db*=ly-2;
  188.  
  189. int idb=(int) db;
  190.  
  191. fl_rectf(ox,oy+ly-idb,lx,idb,0,200,255);
  192. fl_rectf(ox,oy,lx,ly-idb,0,0,0);
  193.  
  194.  
  195. //draw the scales
  196. REALTYPE  tmp=ly*1.0/MIN_DB;
  197.  for (int i=1;i<1-MIN_DB;i++){
  198.     int ty=ly+(int) (tmp*i);
  199.     if (i%5==0) fl_rectf(ox,oy+ly-ty,lx,1,0,160,200);
  200.     if (i%10==0) fl_rectf(ox,oy+ly-ty,lx,1,0,230,240);
  201. };} {}
  202.   }
  203.   Function {draw()} {} {
  204.     code {if (npart>=0) draw_part();
  205.    else draw_master();} {}
  206.   }
  207.   Function {tickdraw(VUMeter *o)} {return_type {static void}
  208.   } {
  209.     code {o->redraw();} {}
  210.   }
  211.   Function {tick(void *v)} {return_type {static void}
  212.   } {
  213.     code {tickdraw((VUMeter *) v);
  214. Fl::add_timeout(1.0/25.0,tick,v);//25 fps} {}
  215.   }
  216.   Function {handle(int event)} {return_type int
  217.   } {
  218.     code {switch(event){
  219.    case FL_SHOW:
  220.              tick(this);
  221.              break;
  222.    case FL_HIDE:
  223.              Fl::remove_timeout(tick,this);
  224.              break;
  225.    case FL_PUSH:
  226.              if (npart>=0) break;
  227.              pthread_mutex_lock(&master->mutex);
  228.              master->vuresetpeaks();
  229.              pthread_mutex_unlock(&master->mutex);
  230.              break;
  231. };
  232. return(1);} {}
  233.   }
  234.   decl {Master *master;} {}
  235.   decl {int npart;} {}
  236.   decl {float olddbl,olddbr;} {}
  237.   decl {float oldrmsdbl,oldrmsdbr;} {}
  238.  
  239. class SysEffSend {: {public WidgetPDial}
  240. } {
  241.   Function {SysEffSend(int x,int y, int w, int h, const char *label=0):WidgetPDial(x,y,w,h,label)} {} {
  242.     code {master=NULL;
  243. neff1=0;
  244. neff2=0;} {}
  245.   }
  246.   Function {init(Master *master_,int neff1_,int neff2_)} {} {
  247.     code {neff1=neff1_;
  248. neff2=neff2_;
  249. master=master_;
  250. minimum(0);
  251. maximum(127);
  252. step(1);
  253. labelfont(1);
  254. labelsize(10);
  255. align(FL_ALIGN_TOP);
  256.  
  257. value(master->Psysefxsend[neff1][neff2]);
  258. char tmp[20];snprintf(tmp,20,"%d->%d",neff1+1,neff2+1);this->label(strdup(tmp));} {}
  259.   }
  260.   Function {~SysEffSend()} {} {
  261.     code {hide();} {}
  262.   }
  263.   Function {handle(int event)} {return_type int
  264.   } {
  265.     code {if ((event==FL_PUSH) || (event==FL_DRAG)){
  266.    master->setPsysefxsend(neff1,neff2,(int) value());
  267. };
  268.  
  269. return(WidgetPDial::handle(event));} {}
  270.   }
  271.   decl {Master *master;} {}
  272.   decl {int neff1;} {}
  273.   decl {int neff2;} {}
  274.  
  275. class Panellistitem {: {public Fl_Group}
  276. } {
  277.   Function {make_window()} {private
  278.   } {
  279.     Fl_Window panellistitem {
  280.       private xywh {315 213 70 260} type Double hide
  281.       class Fl_Group
  282.     } {
  283.       Fl_Group panellistitemgroup {
  284.         private xywh {0 20 70 240} box PLASTIC_THIN_UP_BOX
  285.         code0 {if (master->part[npart]->Penabled==0) o->deactivate();}
  286.       } {
  287.         Fl_Group {} {
  288.           xywh {45 65 15 110} box ENGRAVED_FRAME
  289.         } {
  290.           Fl_Box {} {
  291.             label {V U}
  292.             xywh {45 65 15 110} box FLAT_BOX color 0 selection_color 75 labelcolor 55 align 128
  293.             code0 {o->init(master,npart);}
  294.             class VUMeter
  295.           }
  296.         }
  297.         Fl_Button partname {
  298.           label {  }
  299.           callback {if ((int)bankui->cbwig->value()!=(npart+1)){
  300.    bankui->cbwig->value(npart+1);
  301.    bankui->cbwig->do_callback();
  302. };
  303. bankui->show();}
  304.           xywh {5 27 60 30} box THIN_DOWN_BOX down_box FLAT_BOX labelfont 1 labelsize 10 align 208
  305.         }
  306.         Fl_Slider partvolume {
  307.           callback {master->part[npart]->setPvolume((int) o->value());}
  308.           xywh {10 65 30 110} type {Vert Knob} box FLAT_BOX minimum 127 maximum 0 step 1 value 127
  309.           code0 {o->value(master->part[npart]->Pvolume);}
  310.         }
  311.         Fl_Dial partpanning {
  312.           callback {master->part[npart]->setPpanning((int) o->value());}
  313.           xywh {20 180 30 30} maximum 127 step 1
  314.           code0 {o->value(master->part[npart]->Ppanning);}
  315.           class WidgetPDial
  316.         }
  317.         Fl_Button {} {
  318.           label edit
  319.           callback {if ((int)bankui->cbwig->value()!=(npart+1)){
  320.    bankui->cbwig->value(npart+1);
  321.    bankui->cbwig->do_callback();
  322. };}
  323.           xywh {15 235 40 20} box PLASTIC_UP_BOX labelsize 10
  324.         }
  325.         Fl_Choice partrcv {
  326.           callback {master->part[npart]->Prcvchn=(int) o->value();} open
  327.           tooltip {receive from Midi channel} xywh {10 213 50 15} down_box BORDER_BOX labelsize 10 align 5 textfont 1 textsize 10
  328.           code0 {char nrstr[10]; for(int i=0;i<NUM_MIDI_CHANNELS;i++){sprintf(nrstr,"Ch%d",i+1);if (i!=9) o->add(nrstr); else o->add("Dr10");};}
  329.           code1 {o->value(master->part[npart]->Prcvchn);}
  330.         } {}
  331.       }
  332.       Fl_Check_Button partenabled {
  333.         label 01
  334.         callback {pthread_mutex_lock(&master->mutex);
  335.  master->partonoff(npart,(int) o->value());
  336. pthread_mutex_unlock(&master->mutex);
  337.  
  338. if ((int) o->value()==0) panellistitemgroup->deactivate();
  339.   else {
  340.     panellistitemgroup->activate();
  341.     if ((int)bankui->cbwig->value()!=(npart+1)){
  342.        bankui->cbwig->value(npart+1);
  343.        bankui->cbwig->do_callback();
  344.     };
  345. };
  346.  
  347. o->redraw();}
  348.         private xywh {5 0 45 20} down_box DOWN_BOX labeltype EMBOSSED_LABEL labelfont 1 labelsize 16 align 24
  349.         code0 {char tmp[10];snprintf(tmp,10,"%d",npart+1);o->label(strdup(tmp));}
  350.         code1 {o->value(master->part[npart]->Penabled);}
  351.       }
  352.     }
  353.   }
  354.   Function {Panellistitem(int x,int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} {
  355.     code {npart=0;
  356. master=NULL;
  357. bankui=NULL;} {}
  358.   }
  359.   Function {init(Master *master_, int npart_,BankUI *bankui_)} {} {
  360.     code {npart=npart_;
  361. master=master_;
  362. bankui=bankui_;
  363.  
  364. make_window();
  365. panellistitem->show();
  366. end();} {}
  367.   }
  368.   Function {refresh()} {open
  369.   } {
  370.     code {partenabled->value(master->part[npart]->Penabled);
  371. if (master->part[npart]->Penabled!=0) panellistitemgroup->activate();
  372.      else panellistitemgroup->deactivate();
  373.  
  374. partvolume->value(master->part[npart]->Pvolume);
  375. partpanning->value(master->part[npart]->Ppanning);
  376. partrcv->value(master->part[npart]->Prcvchn);
  377.  
  378. partname->label((char *)master->part[npart]->Pname);
  379.  
  380. if ((int)bankui->cbwig->value()!=(npart+1))
  381.    panellistitemgroup->color(fl_rgb_color(160,160,160));
  382. else 
  383.    panellistitemgroup->color(fl_rgb_color(50,190,240));
  384.  
  385. panellistitemgroup->redraw();} {}
  386.   }
  387.   Function {~Panellistitem()} {} {
  388.     code {panellistitem->hide();
  389. //delete(panellistitem);} {}
  390.   }
  391.   decl {int npart;} {}
  392.   decl {Master *master;} {}
  393.   decl {BankUI *bankui;} {}
  394.  
  395. class MasterUI {} {
  396.   Function {make_window()} {} {
  397.     Fl_Window masterwindow {
  398.       label zynaddsubfx
  399.       callback {\#ifdef VSTAUDIOOUT
  400. fl_alert("ZynAddSubFX could not be closed this way, because it's a VST plugin. Please use the host aplication to close it.");
  401. \#else
  402. if (fl_ask("Exit and leave the unsaved data?")) {
  403.     config.save();
  404.     *exitprogram=1;
  405. };
  406. \#endif} selected
  407.       xywh {353 127 390 465} type Double hide
  408.     } {
  409.       Fl_Menu_Bar mastermenu {
  410.         xywh {-5 0 690 25}
  411.       } {
  412.         submenu {} {
  413.           label {&File}
  414.           xywh {0 0 100 20}
  415.         } {
  416.           menuitem {} {
  417.             label {&New (erase all)...}
  418.             callback {do_new_master();}
  419.             xywh {20 20 100 20}
  420.           }
  421.           menuitem {} {
  422.             label {&Open Parameters...}
  423.             callback {do_load_master();}
  424.             xywh {20 20 100 20}
  425.           }
  426.           menuitem {} {
  427.             label {&Save All Parameters...}
  428.             callback {do_save_master();}
  429.             xywh {10 10 100 20} divider
  430.           }
  431.           menuitem {} {
  432.             label {&Load Scale Settings...}
  433.             callback {char *filename;
  434. filename=fl_file_chooser("Open:","({*.xsz})",NULL,0);
  435. if (filename==NULL) return;
  436.  
  437. pthread_mutex_lock(&master->mutex);
  438.   //clear all parameters
  439.   master->microtonal.defaults();
  440.  
  441.   //load the data
  442.   int result=master->microtonal.loadXML(filename);
  443. pthread_mutex_unlock(&master->mutex);
  444.  
  445.  
  446.  delete microtonalui;  
  447.  microtonalui=new MicrotonalUI(&master->microtonal);
  448.  
  449. if (result==-10) fl_alert("Error: Could not load the file\\nbecause it is not a scale file.");
  450.       else if (result<0) fl_alert("Error: Could not load the file.");}
  451.             xywh {35 35 100 20}
  452.           }
  453.           menuitem {} {
  454.             label {Save Sc&ale Settings ..}
  455.             callback {char *filename;
  456. int result=0;
  457.  
  458. filename=fl_file_chooser("Save:","({*.xsz})",NULL,0);
  459. if (filename==NULL) return;
  460. filename=fl_filename_setext(filename,".xsz");
  461.  
  462. result=fileexists(filename);
  463. if (result) {
  464.     result=0;
  465.    if (!fl_ask("The file exists. \\nOverwrite it?")) return;
  466.        
  467. };
  468.  
  469.  
  470. pthread_mutex_lock(&master->mutex);
  471. result=master->microtonal.saveXML(filename);
  472. pthread_mutex_unlock(&master->mutex);
  473.  
  474. if (result<0) fl_alert("Error: Could not save the file.");
  475.  
  476.  
  477. updatepanel();}
  478.             xywh {25 25 100 20}
  479.           }
  480.           menuitem {} {
  481.             label {Show Scale Settings...}
  482.             callback {microtonalui->show();}
  483.             xywh {0 0 100 20} divider
  484.           }
  485.           menuitem {} {
  486.             label {&Settings...}
  487.             callback {configui->show();}
  488.             xywh {25 25 100 20} divider
  489.           }
  490.           menuitem {} {
  491.             label {&Copyright...}
  492.             callback {aboutwindow->show();}
  493.             xywh {15 15 100 20} divider
  494.           }
  495.           menuitem {} {
  496.             label {E&xit}
  497.             callback {masterwindow->do_callback();}
  498.             xywh {10 10 100 20}
  499.           }
  500.         }
  501.         submenu {} {
  502.           label {&Instrument}
  503.           xywh {10 10 100 20}
  504.         } {
  505.           menuitem {} {
  506.             label {&Clear Instrument...}
  507.             callback {if (fl_ask("Clear instrument's parameters ?")){
  508. //       int npart=(int)npartcounter->value()-1;
  509.        pthread_mutex_lock(&master->mutex);
  510.        master->part[npart]->defaultsinstrument();
  511.        pthread_mutex_unlock(&master->mutex);
  512.  
  513.        npartcounter->do_callback();
  514. };
  515.  
  516. updatepanel();}
  517.             xywh {35 35 100 20}
  518.           }
  519.           menuitem {} {
  520.             label {&Open Instrument...}
  521.             callback {const char *filename;
  522. filename=fl_file_chooser("Load:","({*.xiz})",NULL,0);
  523. if (filename==NULL) return;
  524.  
  525.  
  526. pthread_mutex_lock(&master->mutex);
  527. //  int npart=(int)npartcounter->value()-1;
  528.  
  529.   //clear all instrument parameters, first
  530.   master->part[npart]->defaultsinstrument();
  531.  
  532.   //load the instr. parameters
  533.   int result=master->part[npart]->loadXMLinstrument(filename);
  534.  
  535. pthread_mutex_unlock(&master->mutex);
  536. master->part[npart]->applyparameters();
  537.  
  538. npartcounter->do_callback();
  539. updatepanel();
  540.  
  541. if (result==-10) fl_alert("Error: Could not load the file\\nbecause it is not an instrument file.");
  542.       else if (result<0) fl_alert("Error: Could not load the file.");}
  543.             xywh {30 30 100 20}
  544.           }
  545.           menuitem {} {
  546.             label {&Save Instrument ...}
  547.             callback {char *filename;
  548.  
  549. filename=fl_file_chooser("Save:","({*.xiz})",NULL,0);
  550. if (filename==NULL) return;
  551. filename=fl_filename_setext(filename,".xiz");
  552.  
  553. int result=fileexists(filename);
  554. if (result) {
  555.     result=0;
  556.    if (!fl_ask("The file exists. \\nOverwrite it?")) return;
  557.        
  558. };
  559.  
  560.  
  561. pthread_mutex_lock(&master->mutex);
  562. result=master->part[npart]->saveXML(filename);
  563. pthread_mutex_unlock(&master->mutex);
  564.  
  565. if (result<0) fl_alert("Error: Could not save the file.");
  566.  
  567. updatepanel();}
  568.             xywh {20 20 100 20} divider
  569.           }
  570.           menuitem {} {
  571.             label {Show Instrument &Bank...}
  572.             callback {bankui->show();}
  573.             xywh {0 0 100 20} divider
  574.           }
  575.           menuitem {} {
  576.             label {&Virtual Keyboard...}
  577.             callback {virkeyboard->show();}
  578.             xywh {10 10 100 20}
  579.           }
  580.         }
  581.         submenu recordmenu {
  582.           label {&Record}
  583.           xywh {0 0 100 20}
  584.         } {
  585.           menuitem {} {
  586.             label {&Choose WAV file...}
  587.             callback {char *filename;
  588. recordbutton->deactivate();
  589. pausebutton->deactivate();
  590. pauselabel->deactivate();
  591. stopbutton->deactivate();
  592. filename=fl_file_chooser("Record to audio file:","(*.wav)",NULL,0);
  593. if (filename==NULL) return;
  594. fl_filename_setext(filename,".wav");
  595.  
  596. int result=master->HDDRecorder.preparefile(filename,0);
  597. if (result==1) {
  598.     result=0;
  599.    if (fl_ask("The file exists. \\nOverwrite it?"))
  600.        master->HDDRecorder.preparefile(filename,1);
  601. };
  602. if (result==0) recordbutton->activate();
  603.  
  604. if (result!=0) fl_alert("Error: Could not save the file.");}
  605.             xywh {0 0 100 20}
  606.           }
  607.         }
  608.         submenu {} {
  609.           label {&Sequencer}
  610.           xywh {0 0 100 20} hide
  611.         } {
  612.           menuitem {} {
  613.             label {Show &Sequencer...}
  614.             callback {sequi->show();}
  615.             xywh {0 0 100 20}
  616.           }
  617.         }
  618.         submenu {} {
  619.           label Misc
  620.           xywh {10 10 100 20}
  621.         } {
  622.           menuitem {} {
  623.             label {Switch User Interface Mode}
  624.             callback {if (fl_ask("Switch the User Interface to Beginner mode ?")){
  625.     masterwindow->hide();
  626.     refresh_master_ui();
  627.     simplemasterwindow->show();
  628.     config.cfg.UserInterfaceMode=2;
  629. };}
  630.             xywh {10 10 100 20}
  631.           }
  632.         }
  633.       }
  634.       Fl_Dial mastervolumedial {
  635.         label {M.Vol}
  636.         callback {master->setPvolume((int) o->value());}
  637.         tooltip {Master Volume} xywh {5 30 30 30} box ROUND_UP_BOX labelfont 1 labelsize 12 align 130 maximum 127 step 1
  638.         code0 {o->value(master->Pvolume);}
  639.         class WidgetPDial
  640.       }
  641.       Fl_Counter masterkeyshiftcounter {
  642.         label {Master KeyShift}
  643.         callback {master->setPkeyshift((int) o->value()+64);}
  644.         xywh {45 31 90 20} labelsize 12 minimum -64 maximum 64 step 1
  645.         code0 {o->lstep(12);}
  646.         code1 {o->value(master->Pkeyshift-64);}
  647.       }
  648.       Fl_Button {} {
  649.         label {Panic!}
  650.         callback {virkeyboard->relaseallkeys();
  651. pthread_mutex_lock(&master->mutex);
  652. master->shutup=1;
  653. pthread_mutex_unlock(&master->mutex);}
  654.         xywh {293 29 92 31} box PLASTIC_UP_BOX color 231 labelfont 1
  655.       }
  656.       Fl_Group partuigroup {
  657.         xywh {0 242 390 183} box ENGRAVED_FRAME
  658.       } {
  659.         Fl_Group partui {
  660.           xywh {4 245 383 175} box FLAT_BOX
  661.           code0 {o->init(master->part[0],master,0,bankui);}
  662.           code1 {o->show();}
  663.           class PartUI
  664.         } {}
  665.       }
  666.       Fl_Tabs {} {
  667.         xywh {0 80 390 160}
  668.       } {
  669.         Fl_Group {} {
  670.           label {System Effects} open
  671.           xywh {0 100 390 140} box ENGRAVED_FRAME labeltype EMBOSSED_LABEL labelsize 18 align 25
  672.         } {
  673.           Fl_Counter syseffnocounter {
  674.             label {Sys.Effect No.}
  675.             callback {nsyseff=(int) o->value()-1;
  676. sysefftype->value(master->sysefx[nsyseff]->geteffect());
  677. syseffectui->refresh(master->sysefx[nsyseff]);}
  678.             xywh {5 120 80 20} type Simple labelfont 1 labelsize 11 align 1 minimum 0 maximum 127 step 1 value 1 textfont 1
  679.             code0 {o->bounds(1,NUM_SYS_EFX);}
  680.             code1 {o->value(nsyseff+1);}
  681.           }
  682.           Fl_Choice sysefftype {
  683.             label EffType
  684.             callback {pthread_mutex_lock(&master->mutex);
  685. master->sysefx[nsyseff]->changeeffect((int) o->value());
  686. pthread_mutex_unlock(&master->mutex);
  687. syseffectui->refresh(master->sysefx[nsyseff]);}
  688.             xywh {315 125 70 15} down_box BORDER_BOX labelsize 11
  689.             code0 {o->value(master->sysefx[nsyseff]->geteffect());}
  690.           } {
  691.             menuitem {} {
  692.               label {No Effect}
  693.               xywh {10 10 100 20} labelfont 1 labelsize 11
  694.             }
  695.             menuitem {} {
  696.               label Reverb
  697.               xywh {20 20 100 20} labelfont 1 labelsize 11
  698.             }
  699.             menuitem {} {
  700.               label Echo
  701.               xywh {30 30 100 20} labelfont 1 labelsize 11
  702.             }
  703.             menuitem {} {
  704.               label Chorus
  705.               xywh {40 40 100 20} labelfont 1 labelsize 11
  706.             }
  707.             menuitem {} {
  708.               label Phaser
  709.               xywh {50 50 100 20} labelfont 1 labelsize 11
  710.             }
  711.             menuitem {} {
  712.               label AlienWah
  713.               xywh {60 60 100 20} labelfont 1 labelsize 11
  714.             }
  715.             menuitem {} {
  716.               label Distortion
  717.               xywh {70 70 100 20} labelfont 1 labelsize 11
  718.             }
  719.             menuitem {} {
  720.               label EQ
  721.               xywh {80 80 100 20} labelfont 1 labelsize 11
  722.             }
  723.             menuitem {} {
  724.               label DynFilter
  725.               xywh {90 90 100 20} labelfont 1 labelsize 11
  726.             }
  727.           }
  728.           Fl_Group syseffectuigroup {
  729.             xywh {5 140 380 95} box FLAT_BOX color 48
  730.           } {
  731.             Fl_Group syseffectui {
  732.               xywh {5 140 380 95}
  733.               code0 {o->init(master->sysefx[nsyseff]);}
  734.               class EffUI
  735.             } {}
  736.           }
  737.           Fl_Button {} {
  738.             label {Send to...}
  739.             callback {syseffsendwindow->show();}
  740.             xywh {95 120 75 20} box THIN_UP_BOX labelfont 1 labelsize 12
  741.           }
  742.           Fl_Button {} {
  743.             label C
  744.             callback {presetsui->copy(master->sysefx[nsyseff]);}
  745.             xywh {215 124 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 12 labelcolor 7
  746.           }
  747.           Fl_Button {} {
  748.             label P
  749.             callback {pthread_mutex_lock(&master->mutex);
  750. presetsui->paste(master->sysefx[nsyseff],syseffectui);
  751. pthread_mutex_unlock(&master->mutex);}
  752.             xywh {245 124 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 12 labelcolor 7
  753.           }
  754.         }
  755.         Fl_Group {} {
  756.           label {Insertion Effects}
  757.           xywh {0 100 390 140} box ENGRAVED_FRAME labeltype EMBOSSED_LABEL labelsize 18 align 25 hide
  758.         } {
  759.           Fl_Counter inseffnocounter {
  760.             label {Ins.Effect No.}
  761.             callback {ninseff=(int) o->value()-1;
  762. insefftype->value(master->insefx[ninseff]->geteffect());
  763. inseffpart->value(master->Pinsparts[ninseff]+2);
  764. inseffectui->refresh(master->insefx[ninseff]);
  765.  
  766. if (master->Pinsparts[ninseff]!=-1) {
  767.         insefftype->activate();
  768.     inseffectui->activate();
  769.         inseffectuigroup->activate();
  770. } else {
  771.     insefftype->deactivate();
  772.      inseffectui->deactivate();
  773.         inseffectuigroup->deactivate();
  774. };}
  775.             xywh {5 120 80 20} type Simple labelfont 1 labelsize 11 align 1 minimum 0 maximum 127 step 1 value 1 textfont 1
  776.             code0 {o->bounds(1,NUM_INS_EFX);}
  777.             code1 {o->value(ninseff+1);}
  778.           }
  779.           Fl_Choice insefftype {
  780.             label EffType
  781.             callback {pthread_mutex_lock(&master->mutex);
  782. master->insefx[ninseff]->changeeffect((int) o->value());
  783. pthread_mutex_unlock(&master->mutex);
  784. inseffectui->refresh(master->insefx[ninseff]);
  785. inseffectui->show();}
  786.             xywh {315 125 70 15} down_box BORDER_BOX labelsize 11
  787.             code0 {o->value(master->insefx[ninseff]->geteffect());}
  788.             code1 {if (master->Pinsparts[ninseff]== -1) o->deactivate();}
  789.           } {
  790.             menuitem {} {
  791.               label {No Effect}
  792.               xywh {25 25 100 20} labelfont 1 labelsize 11
  793.             }
  794.             menuitem {} {
  795.               label Reverb
  796.               xywh {35 35 100 20} labelfont 1 labelsize 11
  797.             }
  798.             menuitem {} {
  799.               label Echo
  800.               xywh {45 45 100 20} labelfont 1 labelsize 11
  801.             }
  802.             menuitem {} {
  803.               label Chorus
  804.               xywh {55 55 100 20} labelfont 1 labelsize 11
  805.             }
  806.             menuitem {} {
  807.               label Phaser
  808.               xywh {60 60 100 20} labelfont 1 labelsize 11
  809.             }
  810.             menuitem {} {
  811.               label AlienWah
  812.               xywh {70 70 100 20} labelfont 1 labelsize 11
  813.             }
  814.             menuitem {} {
  815.               label Distortion
  816.               xywh {80 80 100 20} labelfont 1 labelsize 11
  817.             }
  818.             menuitem {} {
  819.               label EQ
  820.               xywh {90 90 100 20} labelfont 1 labelsize 11
  821.             }
  822.             menuitem {} {
  823.               label DynFilter
  824.               xywh {100 100 100 20} labelfont 1 labelsize 11
  825.             }
  826.           }
  827.           Fl_Group inseffectuigroup {
  828.             xywh {5 140 380 95} box FLAT_BOX color 48
  829.           } {
  830.             Fl_Group inseffectui {
  831.               xywh {5 140 380 95}
  832.               code0 {o->init(master->insefx[ninseff]);}
  833.               code1 {if (master->Pinsparts[ninseff]== -1) o->deactivate();}
  834.               class EffUI
  835.             } {}
  836.           }
  837.           Fl_Choice inseffpart {
  838.             label {Insert To.}
  839.             callback {master->Pinsparts[ninseff]=(int) o->value()-2;
  840. if ((int) o->value()==1){
  841.     inseffectuigroup->deactivate();
  842.     insefftype->deactivate();
  843.     inseffectui->deactivate();
  844. } else {
  845.     inseffectuigroup->activate();
  846.     insefftype->activate();
  847.     inseffectui->activate();
  848. };
  849. master->insefx[ninseff]->cleanup();} open
  850.             xywh {95 120 80 20} down_box BORDER_BOX labelfont 1 labelsize 10 align 5 textsize 10
  851.             code0 {o->add("Master Out");o->add("Off");}
  852.             code1 {char tmp[50]; for (int i=0;i<NUM_MIDI_PARTS;i++) {sprintf(tmp,"Part %2d",i+1);o->add(tmp);};}
  853.             code3 {o->value(master->Pinsparts[ninseff]+2);}
  854.           } {}
  855.           Fl_Button {} {
  856.             label C
  857.             callback {presetsui->copy(master->insefx[ninseff]);}
  858.             xywh {215 124 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 12 labelcolor 7
  859.           }
  860.           Fl_Button {} {
  861.             label P
  862.             callback {pthread_mutex_lock(&master->mutex);
  863. presetsui->paste(master->insefx[ninseff],inseffectui);
  864. pthread_mutex_unlock(&master->mutex);}
  865.             xywh {245 124 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 12 labelcolor 7
  866.           }
  867.         }
  868.       }
  869.       Fl_Button {} {
  870.         label Scales
  871.         callback {microtonalui->show();}
  872.         xywh {330 80 56 19} box PLASTIC_UP_BOX color 231 labeltype ENGRAVED_LABEL labelfont 1
  873.       }
  874.       Fl_Group {} {
  875.         xywh {172 30 117 45} box ENGRAVED_BOX
  876.       } {
  877.         Fl_Button recordbutton {
  878.           label {Rec.}
  879.           callback {o->deactivate();
  880. recordmenu->deactivate();
  881. recordmenu->label("&Record(*)");
  882. stopbutton->activate();
  883. pausebutton->activate();
  884. pauselabel->activate();
  885. master->HDDRecorder.start();
  886. master->vuresetpeaks();
  887. mastermenu->redraw();}
  888.           tooltip {Start Recording} xywh {181 36 21 21} box ROUND_UP_BOX color 88 labelfont 1 labelsize 10 align 2 deactivate
  889.         }
  890.         Fl_Button stopbutton {
  891.           label Stop
  892.           callback {o->deactivate();
  893. master->HDDRecorder.stop();
  894. recordbutton->deactivate();
  895. pausebutton->deactivate();
  896. pauselabel->deactivate();
  897. recordmenu->activate();
  898. recordmenu->label("&Record");
  899. mastermenu->redraw();}
  900.           tooltip {Stop Recording and close the audio file} xywh {259 36 21 21} box THIN_UP_BOX color 4 labelfont 1 labelsize 10 align 2 deactivate
  901.         }
  902.         Fl_Button pausebutton {
  903.           label {@||}
  904.           callback {o->deactivate();
  905. master->HDDRecorder.pause();
  906. recordbutton->activate();
  907. mastermenu->redraw();}
  908.           tooltip {Pause Recording} xywh {220 36 21 21} box THIN_UP_BOX color 4 selection_color 4 labelfont 1 labelcolor 3 align 16 deactivate
  909.         }
  910.         Fl_Box pauselabel {
  911.           label Pause
  912.           xywh {214 56 30 15} labelfont 1 labelsize 10 deactivate
  913.         }
  914.       }
  915.       Fl_Group {} {
  916.         xywh {1 427 389 33} box ENGRAVED_FRAME
  917.       } {
  918.         Fl_Box {} {
  919.           label {VU-Meter}
  920.           xywh {4 430 384 30} box FLAT_BOX color 48 selection_color 75
  921.           code0 {o->init(master,-1);}
  922.           class VUMeter
  923.         }
  924.       }
  925.       Fl_Check_Button nrpnbutton {
  926.         label NRPN
  927.         callback {master->ctl.NRPN.receive=(int) o->value();}
  928.         tooltip {Receive NRPNs} xywh {45 65 47 10} down_box DOWN_BOX labelsize 10
  929.         code0 {o->value(master->ctl.NRPN.receive);}
  930.       }
  931.       Fl_Counter npartcounter {
  932.         callback {int nval=(int) o->value()-1;
  933. partuigroup->remove(partui);
  934. delete partui;
  935. partui=new PartUI(0,0,765,525);
  936. partuigroup->add(partui);
  937. partui->init(master->part[nval],master,nval,bankui);
  938. partui->redraw();
  939. o->redraw();
  940. npart=nval;
  941.  
  942. updatepanel();
  943. simplenpartcounter->value(nval+1);
  944. simplenpartcounter->do_callback();}
  945.         tooltip {The part number} xywh {5 247 70 23} type Simple labelfont 1 minimum 0 maximum 127 step 1 value 1 textfont 1
  946.         code0 {o->bounds(1,NUM_MIDI_PARTS);}
  947.         code1 {bankui->init(o);}
  948.       }
  949.       Fl_Button {} {
  950.         label vK
  951.         callback {virkeyboard->show();}
  952.         tooltip {Virtual Keyboard} xywh {292 80 35 19} box PLASTIC_UP_BOX color 231 labeltype ENGRAVED_LABEL labelfont 1
  953.       }
  954.       Fl_Button {} {
  955.         label {R.D.}
  956.         callback {globalfinedetuneslider->value(64.0);
  957. globalfinedetuneslider->do_callback();}
  958.         tooltip {Master fine detune reset} xywh {140 65 30 10} box THIN_UP_BOX labelfont 1 labelsize 10
  959.       }
  960.       Fl_Dial globalfinedetuneslider {
  961.         label {F.Det.}
  962.         callback {master->microtonal.Pglobalfinedetune=(int) o->value();}
  963.         tooltip {global fine detune} xywh {143 30 20 20} box ROUND_UP_BOX labelsize 10 align 130 maximum 127 step 1 value 64
  964.         code0 {o->value(master->microtonal.Pglobalfinedetune);}
  965.         class WidgetPDial
  966.       }
  967.       Fl_Button {} {
  968.         label {Panel Window}
  969.         callback {updatepanel();
  970. panelwindow->show();}
  971.         tooltip {Panel Window} xywh {293 62 92 16} box PLASTIC_UP_BOX color 183 labelfont 1 labelsize 10
  972.       }
  973.     }
  974.     Fl_Window aboutwindow {
  975.       label {Copyright...}
  976.       xywh {629 278 330 210} type Double hide
  977.     } {
  978.       Fl_Box {} {
  979.         label {Copyright (c) 2002-2005 Nasca O. Paul}
  980.         xywh {5 35 320 25} labeltype EMBOSSED_LABEL labelsize 18 align 16
  981.       }
  982.       Fl_Box {} {
  983.         label {This is free software; you may redistribute it and/or modify it under the terms of the 
  984. version 2 of the GNU General Public License as published by the Free Software Fundation.
  985.   This program comes with
  986.  ABSOLUTELY NO WARRANTY. 
  987.  See the version 2 of the 
  988. GNU General Public License for details.}
  989.         xywh {0 60 325 115} labelfont 1 labelsize 12 align 144
  990.       }
  991.       Fl_Button {} {
  992.         label {Close this window}
  993.         callback {aboutwindow->hide();}
  994.         xywh {80 180 180 25} box THIN_UP_BOX labelsize 12
  995.       }
  996.       Fl_Box {} {
  997.         label ZynAddSubFX
  998.         xywh {5 5 325 30} labeltype EMBOSSED_LABEL labelfont 1 labelsize 24 labelcolor 0 align 16
  999.       }
  1000.     }
  1001.     Fl_Window syseffsendwindow {
  1002.       label {System Effects Send}
  1003.       xywh {171 234 120 250} type Double hide resizable
  1004.     } {
  1005.       Fl_Scroll {} {open
  1006.         xywh {0 45 120 170} box FLAT_BOX resizable
  1007.         code0 {for (int neff1=0;neff1<NUM_SYS_EFX;neff1++) for (int neff2=neff1+1;neff2<NUM_SYS_EFX;neff2++)}
  1008.         code1 {{syseffsend[neff1][neff2]=new SysEffSend(o->x()+(neff2-1)*35,o->y()+15+neff1*50,30,30);syseffsend[neff1][neff2]->label("aaa");syseffsend[neff1][neff2]->init(master,neff1,neff2);};}
  1009.       } {}
  1010.       Fl_Button {} {
  1011.         label Close
  1012.         callback {syseffsendwindow->hide();}
  1013.         xywh {25 220 80 25} box THIN_UP_BOX
  1014.       }
  1015.       Fl_Box {} {
  1016.         label {Send system effect's output to other system effects}
  1017.         xywh {5 5 110 35} labelsize 10 align 192
  1018.       }
  1019.     }
  1020.     Fl_Window panelwindow {
  1021.       label {ZynAddSubFX Panel}
  1022.       xywh {72 60 630 635} type Double hide
  1023.     } {
  1024.       Fl_Scroll {} {open
  1025.         xywh {0 5 570 310} type HORIZONTAL box THIN_UP_BOX
  1026.       } {
  1027.         Fl_Pack {} {open
  1028.           xywh {5 10 560 285} type HORIZONTAL
  1029.           code0 {for (int i=0;i<NUM_MIDI_PARTS/2;i++){panellistitem[i]=new Panellistitem(0,0,70,260,"");panellistitem[i]->init(master,i,bankui);}}
  1030.         } {}
  1031.       }
  1032.       Fl_Scroll {} {open
  1033.         xywh {0 320 570 310} type HORIZONTAL box THIN_UP_BOX
  1034.       } {
  1035.         Fl_Pack {} {open
  1036.           xywh {5 325 560 285} type HORIZONTAL
  1037.           code0 {for (int i=NUM_MIDI_PARTS/2;i<NUM_MIDI_PARTS;i++){panellistitem[i]=new Panellistitem(0,0,70,260,"");panellistitem[i]->init(master,i,bankui);}}
  1038.         } {}
  1039.       }
  1040.       Fl_Button {} {
  1041.         label Close
  1042.         callback {panelwindow->hide();
  1043. updatepanel();}
  1044.         xywh {575 605 50 25} box THIN_UP_BOX
  1045.       }
  1046.       Fl_Button {} {
  1047.         label Refresh
  1048.         callback {updatepanel();}
  1049.         xywh {575 570 55 25} box THIN_UP_BOX
  1050.       }
  1051.     }
  1052.     Fl_Window simplemasterwindow {
  1053.       label ZynAddSubFX
  1054.       callback {\#ifdef VSTAUDIOOUT
  1055. fl_alert("ZynAddSubFX could not be closed this way, because it's a VST plugin. Please use the host aplication to close it.");
  1056. \#else
  1057. if (fl_ask("Exit and leave the unsaved data?")) {
  1058.     config.save();
  1059.     *exitprogram=1;
  1060. };
  1061. \#endif}
  1062.       xywh {135 383 600 335} type Double hide
  1063.     } {
  1064.       Fl_Menu_Bar {} {
  1065.         xywh {0 0 690 25}
  1066.       } {
  1067.         submenu {} {
  1068.           label {&File}
  1069.           xywh {10 10 100 20}
  1070.         } {
  1071.           menuitem {} {
  1072.             label {&New (erase all)...}
  1073.             callback {do_new_master();}
  1074.             xywh {30 30 100 20}
  1075.           }
  1076.           menuitem {} {
  1077.             label {&Open Parameters...}
  1078.             callback {do_load_master();}
  1079.             xywh {30 30 100 20}
  1080.           }
  1081.           menuitem {} {
  1082.             label {&Save All Parameters...}
  1083.             callback {do_save_master();}
  1084.             xywh {20 20 100 20} divider
  1085.           }
  1086.           menuitem {} {
  1087.             label {&Settings...}
  1088.             callback {configui->show();}
  1089.             xywh {35 35 100 20} divider
  1090.           }
  1091.           menuitem {} {
  1092.             label {&Copyright...}
  1093.             callback {aboutwindow->show();}
  1094.             xywh {25 25 100 20} divider
  1095.           }
  1096.           menuitem {} {
  1097.             label {E&xit}
  1098.             callback {masterwindow->do_callback();}
  1099.             xywh {20 20 100 20}
  1100.           }
  1101.         }
  1102.         submenu {} {
  1103.           label {&Instrument}
  1104.           xywh {20 20 100 20}
  1105.         } {
  1106.           menuitem {} {
  1107.             label {&Open Instrument...}
  1108.             callback {const char *filename;
  1109. filename=fl_file_chooser("Load:","({*.xiz})",NULL,0);
  1110. if (filename==NULL) return;
  1111.  
  1112.  
  1113. pthread_mutex_lock(&master->mutex);
  1114. //  int npart=(int)npartcounter->value()-1;
  1115.  
  1116.   //clear all instrument parameters, first
  1117.   master->part[npart]->defaultsinstrument();
  1118.  
  1119.   //load the instr. parameters
  1120.   int result=master->part[npart]->loadXMLinstrument(filename);
  1121.  
  1122. pthread_mutex_unlock(&master->mutex);
  1123. master->part[npart]->applyparameters();
  1124.  
  1125. simplenpartcounter->do_callback();
  1126.  
  1127. if (result==-10) fl_alert("Error: Could not load the file\\nbecause it is not an instrument file.");
  1128.       else if (result<0) fl_alert("Error: Could not load the file.");}
  1129.             xywh {40 40 100 20}
  1130.           }
  1131.           menuitem {} {
  1132.             label {Show Instrument &Bank...}
  1133.             callback {bankui->show();}
  1134.             xywh {10 10 100 20} divider
  1135.           }
  1136.         }
  1137.         submenu {} {
  1138.           label Misc
  1139.           xywh {0 0 100 20}
  1140.         } {
  1141.           menuitem {} {
  1142.             label {Switch User Interface Mode}
  1143.             callback {if (fl_ask("Switch the User Interface to Advanced mode ?")){
  1144.     simplemasterwindow->hide();
  1145.     refresh_master_ui();
  1146.     masterwindow->show();
  1147.     config.cfg.UserInterfaceMode=1;
  1148. };}
  1149.             xywh {0 0 100 20}
  1150.           }
  1151.         }
  1152.       }
  1153.       Fl_Group simplelistitemgroup {
  1154.         private xywh {125 65 215 150} box ENGRAVED_BOX
  1155.         code0 {if (master->part[npart]->Penabled==0) o->deactivate();}
  1156.       } {
  1157.         Fl_Button partname {
  1158.           callback {if ((int)bankui->cbwig->value()!=(npart+1)){
  1159.    bankui->cbwig->value(npart+1);
  1160.    bankui->cbwig->do_callback();
  1161. };
  1162. bankui->show();}
  1163.           xywh {130 72 205 18} box PLASTIC_THIN_DOWN_BOX down_box FLAT_BOX color 247 labelfont 1 labelsize 12 align 208
  1164.         }
  1165.         Fl_Slider partpanning {
  1166.           label Pan
  1167.           callback {master->part[npart]->setPpanning((int) o->value());}
  1168.           xywh {185 95 70 15} type {Horz Knob} box FLAT_BOX maximum 127 step 1 value 64
  1169.           code0 {o->value(master->part[npart]->Ppanning);}
  1170.         }
  1171.         Fl_Choice partrcv {
  1172.           label {Midi Channel Receive}
  1173.           callback {virkeys->relaseallkeys(0);
  1174. master->part[npart]->Prcvchn=(int) o->value();
  1175. virkeys->midich=(int) o->value();} open
  1176.           tooltip {receive from Midi channel} xywh {140 157 65 18} down_box BORDER_BOX labelsize 11 align 130 textfont 1
  1177.           code0 {char nrstr[10]; for(int i=0;i<NUM_MIDI_CHANNELS;i++){sprintf(nrstr,"Ch%d",i+1);if (i!=9) o->add(nrstr); else o->add("Dr10");};}
  1178.           code1 {o->value(master->part[npart]->Prcvchn);}
  1179.         } {}
  1180.         Fl_Dial partvolume {
  1181.           callback {master->part[npart]->setPvolume((int) o->value());}
  1182.           xywh {145 95 30 30} maximum 127 step 1
  1183.           code0 {o->value(master->part[npart]->Pvolume);}
  1184.           class WidgetPDial
  1185.         }
  1186.         Fl_Box {} {
  1187.           label Volume
  1188.           xywh {130 125 60 15}
  1189.         }
  1190.         Fl_Check_Button simplepartportamento {
  1191.           label Portamento
  1192.           callback {master->part[npart]->ctl.portamento.portamento=(int) o->value();}
  1193.           tooltip {Enable/Disable the portamento} xywh {260 95 75 20} down_box DOWN_BOX labelfont 1 labelsize 10
  1194.           code0 {o->value(master->part[npart]->ctl.portamento.portamento);}
  1195.         }
  1196.         Fl_Counter simpleminkcounter {
  1197.           label {Min.key}
  1198.           callback {master->part[npart]->Pminkey=(int) o->value();
  1199. if (master->part[npart]->Pminkey>master->part[npart]->Pmaxkey) o->textcolor(FL_RED);
  1200.  else o->textcolor(FL_BLACK);}
  1201.           tooltip {Minimum key (that the part receives NoteOn messages)} xywh {210 158 40 15} type Simple labelfont 1 labelsize 10 minimum 0 maximum 127 step 1 textsize 10
  1202.           code0 {o->value(master->part[npart]->Pminkey);}
  1203.         }
  1204.         Fl_Counter simplemaxkcounter {
  1205.           label {Max.key}
  1206.           callback {master->part[npart]->Pmaxkey=(int) o->value();
  1207.  
  1208. if (master->part[npart]->Pminkey>master->part[npart]->Pmaxkey) o->textcolor(FL_RED);
  1209.  else o->textcolor(FL_BLACK);}
  1210.           tooltip {Maximum key (that the part receives NoteOn messages)} xywh {255 158 40 15} type Simple labelfont 1 labelsize 10 minimum 0 maximum 127 step 1 textsize 10
  1211.           code0 {o->value(master->part[npart]->Pmaxkey);}
  1212.         }
  1213.         Fl_Button {} {
  1214.           label m
  1215.           callback {if (master->part[npart]->lastnote>=0) simpleminkcounter->value(master->part[npart]->lastnote);
  1216. simpleminkcounter->do_callback();
  1217. simplemaxkcounter->do_callback();}
  1218.           tooltip {set the minimum key to the last pressed key} xywh {230 188 15 12} box THIN_UP_BOX labelsize 10
  1219.         }
  1220.         Fl_Button {} {
  1221.           label M
  1222.           callback {if (master->part[npart]->lastnote>=0) simplemaxkcounter->value(master->part[npart]->lastnote);
  1223. simplemaxkcounter->do_callback();
  1224. simpleminkcounter->do_callback();}
  1225.           tooltip {set the maximum key to the last pressed key} xywh {260 188 15 12} box THIN_UP_BOX labelsize 10
  1226.         }
  1227.         Fl_Button {} {
  1228.           label R
  1229.           callback {simpleminkcounter->value(0);
  1230. simpleminkcounter->do_callback();
  1231. simplemaxkcounter->value(127);
  1232. simplemaxkcounter->do_callback();}
  1233.           tooltip {reset the minimum key to 0 and maximum key to 127} xywh {245 188 15 12} box THIN_UP_BOX labelfont 1 labelsize 10
  1234.         }
  1235.         Fl_Counter simplepartkeyshiftcounter {
  1236.           label KeyShift
  1237.           callback {master->part[npart]->Pkeyshift=(int) o->value()+64;}
  1238.           xywh {240 120 90 20} labelsize 12 minimum -64 maximum 64 step 1
  1239.           code0 {o->lstep(12);}
  1240.           code1 {o->value(master->part[npart]->Pkeyshift-64);}
  1241.         }
  1242.         Fl_Dial simplesyseffsend {
  1243.           callback {master->setPsysefxvol(npart,nsyseff,(int) o->value());}
  1244.           xywh {300 160 30 30} maximum 127 step 1
  1245.           class WidgetPDial
  1246.         }
  1247.         Fl_Box {} {
  1248.           label Effect
  1249.           xywh {295 190 40 15}
  1250.         }
  1251.       }
  1252.       Fl_Check_Button partenabled {
  1253.         label Enabled
  1254.         callback {pthread_mutex_lock(&master->mutex);
  1255.  master->partonoff(npart,(int) o->value());
  1256. pthread_mutex_unlock(&master->mutex);
  1257.  
  1258. if ((int) o->value()==0) simplelistitemgroup->deactivate();
  1259.   else {
  1260.     simplelistitemgroup->activate();
  1261.     if ((int)bankui->cbwig->value()!=(npart+1)){
  1262.        bankui->cbwig->value(npart+1);
  1263.        bankui->cbwig->do_callback();
  1264.     };
  1265. };
  1266.  
  1267. o->redraw();}
  1268.         private xywh {250 40 85 20} down_box DOWN_BOX labeltype EMBOSSED_LABEL labelfont 1 labelsize 16 align 24
  1269.         code0 {//char tmp[10];snprintf(tmp,10,"%d",npart+1);o->label(strdup(tmp));}
  1270.         code1 {o->value(master->part[npart]->Penabled);}
  1271.       }
  1272.       Fl_Box virkeys {
  1273.         label Keyboard
  1274.         xywh {5 215 590 80} box BORDER_BOX color 17
  1275.         code0 {o->init(master);}
  1276.         class VirKeys
  1277.       }
  1278.       Fl_Group {} {
  1279.         xywh {340 30 255 185} box ENGRAVED_BOX
  1280.       } {
  1281.         Fl_Tabs {} {
  1282.           xywh {345 35 245 175} align 18
  1283.         } {
  1284.           Fl_Group {} {
  1285.             label {System Effects}
  1286.             xywh {345 55 245 155} box ENGRAVED_FRAME labelfont 1 align 18
  1287.           } {
  1288.             Fl_Counter simplesyseffnocounter {
  1289.               label {Sys.Effect No.}
  1290.               callback {nsyseff=(int) o->value()-1;
  1291. simplesysefftype->value(master->sysefx[nsyseff]->geteffect());
  1292. simplesyseffectui->refresh(master->sysefx[nsyseff]);
  1293. simplerefresh();}
  1294.               xywh {350 75 80 20} type Simple labelfont 1 labelsize 11 align 1 minimum 0 maximum 127 step 1 value 1 textfont 1
  1295.               code0 {o->bounds(1,NUM_SYS_EFX);}
  1296.               code1 {o->value(nsyseff+1);}
  1297.             }
  1298.             Fl_Choice simplesysefftype {
  1299.               label EffType
  1300.               callback {pthread_mutex_lock(&master->mutex);
  1301. master->sysefx[nsyseff]->changeeffect((int) o->value());
  1302. pthread_mutex_unlock(&master->mutex);
  1303. simplesyseffectui->refresh(master->sysefx[nsyseff]);}
  1304.               xywh {515 80 70 15} down_box BORDER_BOX labelsize 11 align 5
  1305.               code0 {o->value(master->sysefx[nsyseff]->geteffect());}
  1306.             } {
  1307.               menuitem {} {
  1308.                 label {No Effect}
  1309.                 xywh {20 20 100 20} labelfont 1 labelsize 11
  1310.               }
  1311.               menuitem {} {
  1312.                 label Reverb
  1313.                 xywh {30 30 100 20} labelfont 1 labelsize 11
  1314.               }
  1315.               menuitem {} {
  1316.                 label Echo
  1317.                 xywh {40 40 100 20} labelfont 1 labelsize 11
  1318.               }
  1319.               menuitem {} {
  1320.                 label Chorus
  1321.                 xywh {50 50 100 20} labelfont 1 labelsize 11
  1322.               }
  1323.               menuitem {} {
  1324.                 label Phaser
  1325.                 xywh {60 60 100 20} labelfont 1 labelsize 11
  1326.               }
  1327.               menuitem {} {
  1328.                 label AlienWah
  1329.                 xywh {70 70 100 20} labelfont 1 labelsize 11
  1330.               }
  1331.               menuitem {} {
  1332.                 label Distortion
  1333.                 xywh {80 80 100 20} labelfont 1 labelsize 11
  1334.               }
  1335.               menuitem {} {
  1336.                 label EQ
  1337.                 xywh {90 90 100 20} labelfont 1 labelsize 11
  1338.               }
  1339.               menuitem {} {
  1340.                 label DynFilter
  1341.                 xywh {100 100 100 20} labelfont 1 labelsize 11
  1342.               }
  1343.             }
  1344.             Fl_Group simplesyseffectuigroup {
  1345.               xywh {350 95 235 95} box FLAT_BOX color 48
  1346.             } {
  1347.               Fl_Group simplesyseffectui {
  1348.                 xywh {350 95 234 95}
  1349.                 code0 {o->init(master->sysefx[nsyseff]);}
  1350.                 class SimpleEffUI
  1351.               } {}
  1352.             }
  1353.             Fl_Button {} {
  1354.               label {Send to...}
  1355.               callback {syseffsendwindow->show();}
  1356.               xywh {435 75 75 20} box THIN_UP_BOX labelfont 1 labelsize 12
  1357.             }
  1358.             Fl_Button {} {
  1359.               label P
  1360.               callback {pthread_mutex_lock(&master->mutex);
  1361. presetsui->paste(master->sysefx[nsyseff],simplesyseffectui);
  1362. pthread_mutex_unlock(&master->mutex);}
  1363.               xywh {560 65 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 12 labelcolor 7
  1364.             }
  1365.           }
  1366.           Fl_Group {} {
  1367.             label {Insertion Effects}
  1368.             xywh {345 55 245 155} box ENGRAVED_FRAME labelfont 1 align 18 hide
  1369.           } {
  1370.             Fl_Counter simpleinseffnocounter {
  1371.               label {Ins.Effect No.}
  1372.               callback {ninseff=(int) o->value()-1;
  1373. simpleinsefftype->value(master->insefx[ninseff]->geteffect());
  1374. simpleinseffpart->value(master->Pinsparts[ninseff]+2);
  1375. simpleinseffectui->refresh(master->insefx[ninseff]);
  1376.  
  1377. if (master->Pinsparts[ninseff]!=-1) {
  1378.         simpleinsefftype->activate();
  1379.     simpleinseffectui->activate();
  1380.         simpleinseffectuigroup->activate();
  1381. } else {
  1382.     simpleinsefftype->deactivate();
  1383.      simpleinseffectui->deactivate();
  1384.         simpleinseffectuigroup->deactivate();
  1385. };}
  1386.               xywh {350 75 80 20} type Simple labelfont 1 labelsize 11 align 1 minimum 0 maximum 127 step 1 value 1 textfont 1
  1387.               code0 {o->bounds(1,NUM_INS_EFX);}
  1388.               code1 {o->value(ninseff+1);}
  1389.             }
  1390.             Fl_Choice simpleinsefftype {
  1391.               label EffType
  1392.               callback {pthread_mutex_lock(&master->mutex);
  1393. master->insefx[ninseff]->changeeffect((int) o->value());
  1394. pthread_mutex_unlock(&master->mutex);
  1395. simpleinseffectui->refresh(master->insefx[ninseff]);
  1396. simpleinseffectui->show();}
  1397.               xywh {515 80 70 15} down_box BORDER_BOX labelsize 11 align 5
  1398.               code0 {o->value(master->insefx[ninseff]->geteffect());}
  1399.               code1 {if (master->Pinsparts[ninseff]== -1) o->deactivate();}
  1400.             } {
  1401.               menuitem {} {
  1402.                 label {No Effect}
  1403.                 xywh {35 35 100 20} labelfont 1 labelsize 11
  1404.               }
  1405.               menuitem {} {
  1406.                 label Reverb
  1407.                 xywh {45 45 100 20} labelfont 1 labelsize 11
  1408.               }
  1409.               menuitem {} {
  1410.                 label Echo
  1411.                 xywh {55 55 100 20} labelfont 1 labelsize 11
  1412.               }
  1413.               menuitem {} {
  1414.                 label Chorus
  1415.                 xywh {65 65 100 20} labelfont 1 labelsize 11
  1416.               }
  1417.               menuitem {} {
  1418.                 label Phaser
  1419.                 xywh {70 70 100 20} labelfont 1 labelsize 11
  1420.               }
  1421.               menuitem {} {
  1422.                 label AlienWah
  1423.                 xywh {80 80 100 20} labelfont 1 labelsize 11
  1424.               }
  1425.               menuitem {} {
  1426.                 label Distortion
  1427.                 xywh {90 90 100 20} labelfont 1 labelsize 11
  1428.               }
  1429.               menuitem {} {
  1430.                 label EQ
  1431.                 xywh {100 100 100 20} labelfont 1 labelsize 11
  1432.               }
  1433.               menuitem {} {
  1434.                 label DynFilter
  1435.                 xywh {110 110 100 20} labelfont 1 labelsize 11
  1436.               }
  1437.             }
  1438.             Fl_Group simpleinseffectuigroup {
  1439.               xywh {350 95 234 95} box FLAT_BOX color 48
  1440.             } {
  1441.               Fl_Group simpleinseffectui {
  1442.                 xywh {350 95 234 95}
  1443.                 code0 {o->init(master->insefx[ninseff]);}
  1444.                 code1 {if (master->Pinsparts[ninseff]== -1) o->deactivate();}
  1445.                 class SimpleEffUI
  1446.               } {}
  1447.             }
  1448.             Fl_Choice simpleinseffpart {
  1449.               label {Insert To.}
  1450.               callback {master->Pinsparts[ninseff]=(int) o->value()-2;
  1451. if ((int) o->value()==1){
  1452.     simpleinseffectuigroup->deactivate();
  1453.     simpleinsefftype->deactivate();
  1454.     simpleinseffectui->deactivate();
  1455. } else {
  1456.     simpleinseffectuigroup->activate();
  1457.     simpleinsefftype->activate();
  1458.     simpleinseffectui->activate();
  1459. };
  1460. master->insefx[ninseff]->cleanup();} open
  1461.               xywh {435 75 80 20} down_box BORDER_BOX labelfont 1 labelsize 10 align 5 textsize 10
  1462.               code0 {o->add("Master Out");o->add("Off");}
  1463.               code1 {char tmp[50]; for (int i=0;i<NUM_MIDI_PARTS;i++) {sprintf(tmp,"Part %2d",i+1);o->add(tmp);};}
  1464.               code3 {o->value(master->Pinsparts[ninseff]+2);}
  1465.             } {}
  1466.             Fl_Button {} {
  1467.               label P
  1468.               callback {pthread_mutex_lock(&master->mutex);
  1469. presetsui->paste(master->insefx[ninseff],simpleinseffectui);
  1470. pthread_mutex_unlock(&master->mutex);}
  1471.               xywh {560 65 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 12 labelcolor 7
  1472.             }
  1473.           }
  1474.         }
  1475.       }
  1476.       Fl_Group {} {
  1477.         xywh {5 300 590 30} box ENGRAVED_FRAME
  1478.       } {
  1479.         Fl_Box {} {
  1480.           label {VU-Meter}
  1481.           xywh {5 300 590 30} box FLAT_BOX color 41 selection_color 75
  1482.           code0 {o->init(master,-1);}
  1483.           class VUMeter
  1484.         }
  1485.       }
  1486.       Fl_Dial simplemastervolumedial {
  1487.         label {Master Volume}
  1488.         callback {master->setPvolume((int) o->value());}
  1489.         tooltip {Master Volume} xywh {10 35 40 40} box ROUND_UP_BOX labelfont 1 labelsize 12 align 130 maximum 127 step 1
  1490.         code0 {o->value(master->Pvolume);}
  1491.         class WidgetPDial
  1492.       }
  1493.       Fl_Counter simplemasterkeyshiftcounter {
  1494.         label {Master KeyShift}
  1495.         callback {master->setPkeyshift((int) o->value()+64);}
  1496.         xywh {25 110 90 20} labelsize 12 minimum -64 maximum 64 step 1
  1497.         code0 {o->lstep(12);}
  1498.         code1 {o->value(master->Pkeyshift-64);}
  1499.       }
  1500.       Fl_Button {} {
  1501.         label {Stop ALL sounds!}
  1502.         callback {virkeyboard->relaseallkeys();
  1503. pthread_mutex_lock(&master->mutex);
  1504. master->shutup=1;
  1505. pthread_mutex_unlock(&master->mutex);}
  1506.         xywh {5 149 115 31} box PLASTIC_UP_BOX color 231 labelfont 1 labelsize 12
  1507.       }
  1508.       Fl_Button {} {
  1509.         label Reset
  1510.         callback {simpleglobalfinedetuneslider->value(64.0);
  1511. simpleglobalfinedetuneslider->do_callback();}
  1512.         tooltip {Master fine detune reset} xywh {70 32 50 10} box THIN_UP_BOX labelfont 1 labelsize 12 align 128
  1513.       }
  1514.       Fl_Dial simpleglobalfinedetuneslider {
  1515.         label {Fine Detune}
  1516.         callback {master->microtonal.Pglobalfinedetune=(int) o->value();}
  1517.         tooltip {global fine detune} xywh {80 45 30 30} box ROUND_UP_BOX labelsize 12 align 130 maximum 127 step 1 value 64
  1518.         code0 {o->value(master->microtonal.Pglobalfinedetune);}
  1519.         class WidgetPDial
  1520.       }
  1521.       Fl_Counter simplenpartcounter {
  1522.         label Part
  1523.         callback {virkeys->relaseallkeys(0);
  1524. npartcounter->value(o->value());
  1525. npart=(int) o->value()-1;
  1526.  
  1527. simplerefresh();
  1528. virkeys->midich=master->part[npart]->Prcvchn;}
  1529.         tooltip {The part number} xywh {170 40 70 20} type Simple labelfont 1 align 4 minimum 0 maximum 127 step 1 value 1 textfont 1
  1530.         code0 {o->bounds(1,NUM_MIDI_PARTS);}
  1531.       }
  1532.       Fl_Counter {} {
  1533.         label {Keyb.Oct.}
  1534.         callback {virkeys->relaseallkeys(0);
  1535. virkeys->midioct=(int) o->value();
  1536. virkeys->take_focus();}
  1537.         tooltip {Midi Octave} xywh {5 195 55 20} type Simple labelsize 12 align 8 when 6 minimum 0 maximum 5 step 1 textfont 1 textsize 12
  1538.         code0 {o->value(virkeys->midioct);}
  1539.       }
  1540.     }
  1541.     Fl_Window selectuiwindow {
  1542.       label {User Interface mode}
  1543.       callback {*exitprogram=1;}
  1544.       xywh {342 246 430 250} type Double hide non_modal
  1545.     } {
  1546.       Fl_Box {} {
  1547.         label {Welcome to ZynAddSubFX}
  1548.         xywh {5 5 425 40} labeltype SHADOW_LABEL labelfont 1 labelsize 33
  1549.       }
  1550.       Fl_Box {} {
  1551.         label {Please choose the interface mode:}
  1552.         xywh {10 50 265 25} labelfont 1 labelsize 16
  1553.       }
  1554.       Fl_Button {} {
  1555.         label Advanced
  1556.         callback {config.cfg.UserInterfaceMode=1;
  1557. masterwindow->show();
  1558. selectuiwindow->hide();}
  1559.         xywh {10 165 100 35} box PLASTIC_UP_BOX color 229 labelfont 1 labelsize 20
  1560.       }
  1561.       Fl_Box {} {
  1562.         label {.. if you have used ZynAddSubFX before, or you like to have full controll to all parameters.}
  1563.         xywh {110 165 310 35} labelfont 1 labelsize 13 align 144
  1564.       }
  1565.       Fl_Button {} {
  1566.         label Beginner
  1567.         callback {simplemasterwindow->show();
  1568. selectuiwindow->hide();
  1569. config.cfg.UserInterfaceMode=2;}
  1570.         xywh {10 80 100 65} box PLASTIC_UP_BOX color 238 labelfont 1 labelsize 20
  1571.       }
  1572.       Fl_Box {} {
  1573.         label {..if you are a beginner, you prefer using presets or you prefer to use simpler user interfaces. Most functionality of ZynAddSubFX will be hidden in this mode to make simple the learning/using it.}
  1574.         xywh {110 75 320 75} labelfont 1 labelsize 13 align 144
  1575.       }
  1576.       Fl_Box {} {
  1577.         label {You can switch the interface modes anytime you want.}
  1578.         xywh {30 215 360 25} box BORDER_BOX color 51 labelfont 1 labelsize 13 align 144
  1579.       }
  1580.     }
  1581.   }
  1582.   Function {updatesendwindow()} {} {
  1583.     code {for (int neff1=0;neff1<NUM_SYS_EFX;neff1++) 
  1584.   for (int neff2=neff1+1;neff2<NUM_SYS_EFX;neff2++)
  1585.     syseffsend[neff1][neff2]->value(master->Psysefxsend[neff1][neff2]);} {}
  1586.   }
  1587.   Function {updatepanel()} {} {
  1588.     code {for (int npart=0;npart<NUM_MIDI_PARTS;npart++){
  1589.   panellistitem[npart]->refresh();
  1590. };} {}
  1591.   }
  1592.   Function {setfilelabel(const char *filename)} {} {
  1593.     code {if (filename!=NULL) snprintf(&masterwindowlabel[0],100,"%s - ZynAddSubFX",fl_filename_name(filename));
  1594.   else snprintf(&masterwindowlabel[0],100,"%s","ZynAddSubFX (c)2002-2005 Nasca O. Paul");
  1595. masterwindowlabel[99]='\\0';
  1596. masterwindow->label(&masterwindowlabel[0]);
  1597. simplemasterwindow->label(&masterwindowlabel[0]);} {}
  1598.   }
  1599.   Function {MasterUI(Master *master_,int *exitprogram_)} {} {
  1600.     code {master=master_;
  1601. exitprogram=exitprogram_;
  1602. ninseff=0;
  1603. nsyseff=0;
  1604. npart=0;
  1605.  
  1606. for (int i=0;i<NUM_SYS_EFX;i++)
  1607.    for (int j=0;j<NUM_SYS_EFX;j++)
  1608.      syseffsend[i][j]=NULL;
  1609.  
  1610. microtonalui=new MicrotonalUI(&master->microtonal);
  1611. virkeyboard=new VirKeyboard(master);
  1612. bankui=new BankUI(master,&npart);
  1613. configui=new ConfigUI();
  1614. sequi=new SeqUI(master);
  1615.  
  1616. make_window();
  1617. presetsui=new PresetsUI();
  1618. setfilelabel(NULL);
  1619. swapefftype=0;
  1620. simplerefresh();} {}
  1621.   }
  1622.   Function {~MasterUI()} {} {
  1623.     code {masterwindow->hide();
  1624. delete (masterwindow);
  1625. aboutwindow->hide();
  1626. delete (aboutwindow);
  1627. syseffsendwindow->hide();
  1628. delete(syseffsendwindow);
  1629.  
  1630. delete (virkeyboard);
  1631. delete (microtonalui);
  1632. delete (bankui);
  1633. delete (configui);
  1634. delete (sequi);
  1635.  
  1636. delete(presetsui);} {}
  1637.   }
  1638.   Function {showUI()} {} {
  1639.     code {switch (config.cfg.UserInterfaceMode){
  1640.     case 0:selectuiwindow->show();
  1641.     break;
  1642.     case 1:masterwindow->show();
  1643.     break;
  1644.     case 2:simplemasterwindow->show();
  1645.     break;
  1646. };} {}
  1647.   }
  1648.   Function {simplerefresh()} {} {
  1649.     code {partenabled->value(master->part[npart]->Penabled);
  1650. if (master->part[npart]->Penabled!=0) simplelistitemgroup->activate();
  1651.      else simplelistitemgroup->deactivate();
  1652.  
  1653. partvolume->value(master->part[npart]->Pvolume);
  1654. partpanning->value(master->part[npart]->Ppanning);
  1655. partrcv->value(master->part[npart]->Prcvchn);
  1656.  
  1657. if (master->part[npart]->Pname[0]!=0) partname->label((char *)master->part[npart]->Pname);
  1658.     else partname->label("Click here to load a instrument");
  1659.  
  1660. simplelistitemgroup->redraw();
  1661. simplepartportamento->value(master->part[npart]->ctl.portamento.portamento);
  1662. simpleminkcounter->value(master->part[npart]->Pminkey);
  1663. simplemaxkcounter->value(master->part[npart]->Pmaxkey);
  1664.  
  1665. simplepartkeyshiftcounter->value(master->part[npart]->Pkeyshift-64);
  1666. simplesyseffsend->value(master->Psysefxvol[nsyseff][npart]);} {}
  1667.   }
  1668.   Function {do_new_master()} {} {
  1669.     code {if (fl_ask("Clear *ALL* the parameters ?")){
  1670.        delete microtonalui;
  1671.  
  1672.        pthread_mutex_lock(&master->mutex);
  1673.     master->defaults();
  1674.        pthread_mutex_unlock(&master->mutex);
  1675.     
  1676.        npartcounter->value(1);
  1677.        refresh_master_ui();
  1678.  
  1679. };
  1680.  
  1681. updatepanel();} {}
  1682.   }
  1683.   Function {do_load_master()} {} {
  1684.     code {char *filename;
  1685. filename=fl_file_chooser("Open:","({*.xmz})",NULL,0);
  1686. if (filename==NULL) return;
  1687.  
  1688.  
  1689. pthread_mutex_lock(&master->mutex);
  1690.   //clear all parameters
  1691.   master->defaults();
  1692.  
  1693.   //load the data
  1694.   int result=master->loadXML(filename);
  1695. pthread_mutex_unlock(&master->mutex);
  1696. master->applyparameters();
  1697.  
  1698. npartcounter->value(1);
  1699. refresh_master_ui();
  1700. updatepanel();
  1701. if (result>=0) setfilelabel(filename);
  1702.  
  1703.  
  1704. if (result==-10) fl_alert("Error: Could not load the file\\nbecause it is not a zynaddsubfx parameters file.");
  1705.       else if (result<0) fl_alert("Error: Could not load the file.");} {}
  1706.   }
  1707.   Function {do_save_master()} {} {
  1708.     code {char *filename;
  1709. int result=0;
  1710.  
  1711. filename=fl_file_chooser("Save:","({*.xmz})",NULL,0);
  1712. if (filename==NULL) return;
  1713. filename=fl_filename_setext(filename,".xmz");
  1714.  
  1715. result=fileexists(filename);
  1716. if (result) {
  1717.     result=0;
  1718.    if (!fl_ask("The file exists. \\nOverwrite it?")) return;
  1719.        
  1720. };
  1721.  
  1722.  
  1723. pthread_mutex_lock(&master->mutex);
  1724. result=master->saveXML(filename);
  1725. pthread_mutex_unlock(&master->mutex);
  1726.  
  1727. if (result<0) fl_alert("Error: Could not save the file.");
  1728.     else setfilelabel(filename);
  1729.  
  1730. updatepanel();} {}
  1731.   }
  1732.   Function {refresh_master_ui()} {} {
  1733.     code {ninseff=0;
  1734. nsyseff=0;
  1735. npart=0;
  1736.  
  1737. //the Master UI
  1738. npartcounter->do_callback();
  1739. syseffnocounter->do_callback();
  1740. inseffnocounter->do_callback();
  1741. masterkeyshiftcounter->value(master->Pkeyshift-64);
  1742. mastervolumedial->value(master->Pvolume);    
  1743. globalfinedetuneslider->value(master->microtonal.Pglobalfinedetune);   
  1744. microtonalui=new MicrotonalUI(&master->microtonal);
  1745. nrpnbutton->value(master->ctl.NRPN.receive);
  1746. updatesendwindow();
  1747. updatepanel();
  1748.  
  1749. //the simle MasterUI
  1750. simplenpartcounter->value(1);
  1751. simplesyseffnocounter->value(1);
  1752. simpleinseffnocounter->value(1);
  1753. simplenpartcounter->do_callback();
  1754. simplesyseffnocounter->do_callback();
  1755. simpleinseffnocounter->do_callback();
  1756. simplemasterkeyshiftcounter->value(master->Pkeyshift-64);
  1757. simplemastervolumedial->value(master->Pvolume);    
  1758. simpleglobalfinedetuneslider->value(master->microtonal.Pglobalfinedetune);
  1759. virkeys->midich=master->part[npart]->Prcvchn;
  1760.  
  1761. simplerefresh();
  1762. bankui->hide();} {}
  1763.   }
  1764.   decl {Master *master;} {}
  1765.   decl {MicrotonalUI *microtonalui;} {}
  1766.   decl {SeqUI *sequi;} {}
  1767.   decl {BankUI *bankui;} {}
  1768.   decl {int ninseff,npart;} {}
  1769.   decl {int nsyseff;} {}
  1770.   decl {int *exitprogram;} {}
  1771.   decl {SysEffSend *syseffsend[NUM_SYS_EFX][NUM_SYS_EFX];} {}
  1772.   decl {VirKeyboard *virkeyboard;} {}
  1773.   decl {ConfigUI *configui;} {}
  1774.   decl {int swapefftype;} {}
  1775.   decl {char masterwindowlabel[100];} {}
  1776.   decl {Panellistitem *panellistitem[NUM_MIDI_PARTS];} {}
  1777.